#ifndef __BSP_CAN_DEMO_H
#define __BSP_CAN_DEMO_H

#include "stdio.h"
#include "stdint.h"
#include "can.h"
#include "oled.h"

// 常量定义
#define C620_MAX_CURRENT_RAW 16384                         ///< 最大电流原始值
#define C620_MAX_CURRENT_A 20.0f                           ///< 最大电流 (A)
#define C620_ANGLE_MAX 8191                                ///< 角度最大值
#define C620_ANGLE_TO_RAD (2.0f * 3.1415926535f / 8191.0f) ///< 角度转弧度系数
#define C620_ANGLE_TO_DEG (360.0f / 8191.0f)               ///< 角度转度系数
#define C620_CURRENT_TO_A (20.0f / 16384.0f)               ///< 电流原始值转安培系数

// 温度保护阈值
#define C620_TEMP_WARNING 125  ///< 温度警告阈值 (°C)
#define C620_TEMP_SHUTDOWN 180 ///< 温度保护阈值 (°C)

// 超时检测阈值 (ms)
#define C620_COMM_TIMEOUT 100 ///< 通信超时时间



/**
 * @brief C620电机反馈数据结构体
 */
typedef struct
{
    // 原始数据（直接从CAN报文解析）
    uint16_t angle;      ///< 转子机械角度原始值 (0~8191)
    int16_t speed;       ///< 转速原始值 (rpm)
    int16_t current;     ///< 转矩电流原始值 (-16384~16384)
    uint8_t temperature; ///< 电机温度 (°C)

    // 转换后的工程数据
    float angle_rad; ///< 转子机械角度 (弧度, 0~2π)
    float angle_deg; ///< 转子机械角度 (度, 0~360)
    float current_A; ///< 实际电流值 (A, -20~20)
    float torque_Nm; ///< 估算扭矩 (N·m，需根据电机参数计算)

    // 状态标志
    uint8_t is_online;         ///< 在线状态标志 (1:在线, 0:离线)
    uint32_t last_update_time; ///< 最后更新时间 (ms)
} C620_Feedback_t;

/**
 * @brief C620电机控制数据结构体
 */
typedef struct
{
    int16_t target_current; ///< 目标电流值 (-16384~16384)
    float target_current_A; ///< 目标电流值 (A, -20~20)
    uint8_t enabled;        ///< 电机使能状态
} C620_Control_t;

/**
 * @brief C620电机状态监控结构体
 */
typedef struct
{
    uint32_t error_count;      ///< 错误计数
    uint8_t over_temp_flag;    ///< 过热标志
    uint8_t over_current_flag; ///< 过流标志
    uint8_t comm_error_flag;   ///< 通信错误标志
} C620_Monitor_t;

/**
 * @brief C620电机完整实例结构体
 */
typedef struct
{
    uint8_t id;               ///< 电机ID (1~8)
    C620_Feedback_t feedback; ///< 反馈数据
    C620_Control_t control;   ///< 控制数据
    C620_Monitor_t monitor;   ///< 监控数据
} C620_Motor_t;

/**
 * @brief 设置一组电机的电流值
 * @param group 电机组：C620_GROUP_1_4 或 C620_GROUP_5_8
 * @param currents 电流值数组(4个元素)
 */
typedef enum
{
    C620_GROUP_1_4 = 0, // ID1-4
    C620_GROUP_5_8 = 1  // ID5-8
} C620_Group_t;

void BSP_CAN_Init(CAN_HandleTypeDef *hcan_p);       //传递CAN句柄初始化
void BSP_CAN_RM_Send_Loop();
void BSP_CAN_MotorC620_Send_Loop();     // 模拟发送电机数据
#endif
